﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DECOR.DL.DALC.SAPC.Proxy;
using System.Data;
using DECOR.BL.BE;

namespace DECOR.DL.DALC.SAPC
{
    public class MaterialDALC : IMaterialDALC
    {
        
       public static MaterialDALC Instance() {
            if (_instance == null)
            {
                lock (typeof(MaterialDALC))
                {
                    if (_instance == null)
                    {
                        _instance = new MaterialDALC();
                    }
                }
            }
            return _instance;
        }

        private MaterialDALC() { }
        private static volatile MaterialDALC _instance = null;


        #region IMaterialDALC Members


        public List<MaterialBE> buscarMateriales(string pCodAnterior, string pNombre, string pJerarquia, string pOrgVtas, string pCanalDist, string usuarioWeb) //WEBDIST
        {
            MaterialesProxy mProxy = new MaterialesProxy();
            mProxy.Connection = DALC.getConnection;
            if (!mProxy.Connection.IsOpen) { mProxy.Connection.Open(); }
            /* llamando a la función */
            string ex_result = "";
            ZWEB_MATERIALESTable tblMateriales = new ZWEB_MATERIALESTable();

            mProxy.Zweb_Busca_Materiales(pCodAnterior, pNombre, pJerarquia, usuarioWeb, pOrgVtas, pCanalDist, out ex_result, ref tblMateriales); //WEBDIST
            SAP.Connector.SAPConnectionPool.ReturnConnection(mProxy.Connection);
            mProxy.Connection = null;
            /* Manejando el retorno */
            DataTable dt = tblMateriales.ToADODataTable();

            List<MaterialBE> lsMaterial = new List<MaterialBE>();

            //string charStockMax = ParametroDALC.getParamValueStatic("stockMayor");

            foreach (DataRow dr in dt.Rows)
            {
                MaterialBE objMaterial = new MaterialBE();
                objMaterial.CodMaterial = dr["MATNR"].ToString();
                objMaterial.DescMaterial = dr["MAKTX"].ToString();
                //objMaterial.PrecioUnit = 0.00m;//Convert.ToDecimal(dr["UnitPrice"]);
                objMaterial.CodUMedida = dr["MEINS"].ToString();
                objMaterial.Jerarquia = dr["PRDHA"].ToString();
                objMaterial.Peso = Convert.ToDecimal(dr["NTGEW"].ToString());

                objMaterial.ValorRendimiento = Convert.ToDecimal(dr["UMREZ"].ToString());
                objMaterial.UMedidaRendimiendo = dr["MEINH"].ToString();
                objMaterial.TipoMaterial = dr["MFRGR"].ToString();
                objMaterial.PrecioUnit = Convert.ToDecimal(dr["NETPR"].ToString());

                objMaterial.Tipo = dr["MTART"].ToString();

                objMaterial.TieneServ = dr["EXTWG"].ToString().ToUpper() == "SI" ? true : false;
                objMaterial.Descontinuado = dr["DESCONT"].ToString().ToUpper() == "X" ? "D" : "";
                objMaterial.EspecialServ = dr["GROES"].ToString().ToUpper() == "E" ? true : false;

                objMaterial.EsFlete = dr["KTGRM"].ToString().ToUpper().Equals("06") ? true : false;
                objMaterial.EsEstiba = dr["KTGRM"].ToString().ToUpper().Equals("07") ? true : false;
                objMaterial.Stock = Convert.ToDecimal(dr["STOCK"].ToString());
                //if (dr["STOCK"].ToString() == "")
                //{
                //    objMaterial.sStock = "0";
                //}
                //else
                //{
                //    objMaterial.sStock = (Convert.ToDecimal(dr["STOCK"].ToString()) > Convert.ToDecimal(charStockMax)) ? "> " + charStockMax : dr["STOCK"].ToString();
                //}
                

                lsMaterial.Add(objMaterial);
            }
            return lsMaterial;
        }

        //WEBDIST
        public MaterialBE leerMaterial(string pCodigo, string pOrgVtas, string pCanalDist)
        {
            return leerMaterial(pCodigo, pOrgVtas, pCanalDist, "");
        }

        public MaterialBE leerMaterial(string pCodigo, string pOrgVtas, string pCanalDist, string usuarioWeb) //WEBDIST
        {
            MaterialesProxy mProxy = new MaterialesProxy();
            mProxy.Connection = DALC.getConnection;
            if (!mProxy.Connection.IsOpen) { mProxy.Connection.Open(); }
            /* llamando a la función */
            string ex_result = "";
            ZWEB_MATERIALESTable tblMateriales = new ZWEB_MATERIALESTable();
            mProxy.Zweb_Lee_Material(pCodigo, usuarioWeb, pOrgVtas, pCanalDist, out ex_result, ref tblMateriales); //WEBDIST
            SAP.Connector.SAPConnectionPool.ReturnConnection(mProxy.Connection);
            mProxy.Connection = null;
            /* Manejando el retorno */
            DataTable dt = tblMateriales.ToADODataTable();
            MaterialBE objMaterial = new MaterialBE();
            if (dt.Rows.Count == 1)
            {
                DataRow dr = dt.Rows[0];
                objMaterial.CodMaterial = dr["MATNR"].ToString();
                objMaterial.DescMaterial = dr["MAKTX"].ToString();
                //objMaterial.PrecioUnit = 0.00m;//Convert.ToDecimal(dr["UnitPrice"]);
                objMaterial.CodUMedida = dr["MEINS"].ToString();
                objMaterial.Jerarquia = dr["PRDHA"].ToString();
                objMaterial.Peso = Convert.ToDecimal(dr["NTGEW"].ToString());

                objMaterial.ValorRendimiento = Convert.ToDecimal(dr["UMREZ"].ToString());
                objMaterial.UMedidaRendimiendo = dr["MEINH"].ToString();
                objMaterial.TipoMaterial = dr["MFRGR"].ToString();
                objMaterial.PrecioUnit = Convert.ToDecimal(dr["NETPR"].ToString());

                objMaterial.Tipo = dr["MTART"].ToString();

                objMaterial.TieneServ = dr["EXTWG"].ToString().ToUpper() == "SI" ? true : false;
                objMaterial.Descontinuado = dr["DESCONT"].ToString().ToUpper() == "X" ? "D" : "";
                objMaterial.EspecialServ = dr["GROES"].ToString().ToUpper() == "E" ? true : false;

                objMaterial.EsFlete = dr["KTGRM"].ToString().ToUpper().Equals("06") ? true : false;
                objMaterial.EsEstiba = dr["KTGRM"].ToString().ToUpper().Equals("07") ? true : false;
                objMaterial.Stock = Convert.ToDecimal(dr["STOCK"].ToString());

            }
            else { return null; }
            return objMaterial;
        }

        public List<GenericBE> buscarGrupos(string pCodGrupo)
        {
            MaterialesProxy mProxy = new MaterialesProxy();
            mProxy.Connection = DALC.getConnection;
            if (!mProxy.Connection.IsOpen) { mProxy.Connection.Open(); }
            //----------
            TVM1TTable t_tvm1t = new TVM1TTable();
            mProxy.Zweb_Lista_Grpmat(pCodGrupo, ref t_tvm1t);
            SAP.Connector.SAPConnectionPool.ReturnConnection(mProxy.Connection);
            mProxy.Connection = null;
            //----------
            List<GenericBE> lstGrupos = new List<GenericBE>();
            foreach (TVM1T item in t_tvm1t)
            {
                GenericBE obj = new GenericBE();
                obj.Codigo = item.Mvgr1;
                obj.Descripcion = item.Bezei;

                lstGrupos.Add(obj);
            }
            return lstGrupos;
        }

        #endregion

        #region IMaterialDALC Members

        
        #endregion

        #region IMaterialDALC Members


        public List<MaterialBE> buscarMateriales(string pCod, string pCodAnt, string pDesc, string pJerarquia, string pOrgVtas, string pCanalDist, string usuarioWeb)
        {
            throw new NotImplementedException();
        }

        #endregion

        public List<EnlaceMaterialBE> buscarMaterialesAdicionales(string pNumMat, string pWerks)
        {
            List<EnlaceMaterialBE> lstRet = new List<EnlaceMaterialBE>();
            MaterialesProxy mProxy = new MaterialesProxy();
            mProxy.Connection = DALC.getConnection;
            if (!mProxy.Connection.IsOpen) { mProxy.Connection.Open(); }
            //----------
            ZSD_MATERIAL_ADICIONALTable T_Mat_Details = new ZSD_MATERIAL_ADICIONALTable();
            ZSD_HEADER_ADICIONALTable T_Mat_Header = new ZSD_HEADER_ADICIONALTable();
            
            mProxy.Zcm_Sd_012(pNumMat, pWerks, ref T_Mat_Details, ref T_Mat_Header);
            SAP.Connector.SAPConnectionPool.ReturnConnection(mProxy.Connection);
            mProxy.Connection = null;
            //----------
            List<EnlaceMaterialBE> Enlace = new List<EnlaceMaterialBE>();
            foreach (ZSD_HEADER_ADICIONAL item in T_Mat_Header)
            {
                EnlaceMaterialBE obj = new EnlaceMaterialBE();
                obj.Matnr = item.Matnr;
                obj.Werks = item.Werks;
                obj.Stlan = item.Stlan;
                obj.Stlnr = item.Stlnr;
                obj.Stlal = item.Stlal;
                obj.Maktx = "";
                obj.Losbs = item.Losbs;
                obj.Losvn = item.Losvn;
                obj.PosicionListaMateriales = new List<EstructuraPosicinListaMateriales>();
                foreach (ZSD_MATERIAL_ADICIONAL det in T_Mat_Details)
                { 
                    EstructuraPosicinListaMateriales hijo = new EstructuraPosicinListaMateriales();
                    hijo.Matnr = det.Matnr;
                    hijo.STLAL = det.Stlal;
                    hijo.WERKS = det.Werks;
                    obj.PosicionListaMateriales.Add(hijo);
                }

                lstRet.Add(obj);
            }
            return lstRet;            
        }
    }
}
